package generic;

import java.lang.reflect.Array;

/**
 * @author ChangLiang
 * @date 2021/2/1
 */
public class GenericArrayWithTypeToken<T> {
    private T[] array;

    /**
     * 对于新代码，应该传递一个类型标记。
     * 类型标记Class<T>被传递到构造器中， 以便从擦除中恢复，使得我们可以创建需要的实际类型的数组，
     * 尽管从转型中产生的警告必须用@SuppressWarnings压制住。
     *
     * 一旦我们获得了实际类型，就可以返回它， 并获得想耍的结果，就像在main()中看到的那样。
     * 该数组的运行时类型是确切类型T[]
     *
     * @param type
     * @param sz
     */
    @SuppressWarnings("unchecked")
    public GenericArrayWithTypeToken(Class<T> type, int sz) {
        array = (T[]) Array.newInstance(type, sz);
    }

    public void put(int index, T item) {
        array[index] = item;
    }

    public T get(int index) {
        return array[index];
    }

    // Expose the underlying representation:
    public T[] rep() {
        return array;
    }

    public static void main(String[] args) {

        GenericArrayWithTypeToken<Integer> gai = new GenericArrayWithTypeToken<>(Integer.class, 10);

        // This now works:
        Integer[] ia = gai.rep();
    }
}
